Computer software or program code typically comprises a set of instructions that a specific type of computer or computer processor understands, and that can be executed in the computer to perform some task. The processors in computers typically only understand a certain preconfigured set of instructions, known as an instruction set.
Some software is written in what is known as assembly language, low-level code, or machine language, as it comprises instructions that are directly understandable and executable by the processor. More complex software is typically written in a more advanced programming language such as Fortran, C, or Java, and converted from a source code listing written in a programming language to machine language instructions known as object code by a process known as compilation before it can be executed. Advanced programming languages are typically the preferred method of creating all but the simplest software, because such languages typically are easier for programmers to understand. Modem computer languages also provide built-in support for a variety of complex hardware and computer functions, so that relatively simple program language instructions can be used to control complex computer hardware and to perform complex tasks.
The software that is distributed to consumers is typically machine code that is the result of compilation, and is provided in executable form. But, software rarely works as planned or expected when first compiled and executed. The software author or authors typically go through a process known as debugging, in which software flaws or bugs are observed and their cause is found and corrected. Finding the cause of a software bug is a significant challenge in many programming tasks, and has resulted in a variety of debugging software available to programmers. Debugging tools commonly used include tools for examining the contents of memory and of a processor's stored data, as well as tools to proceed through a program step-by-step to observe the results of each step in the program, and are a useful tool in observing the operation of a program so that it can be compared to the expected result or so that unintended operations can be found.